package com.plugin.mybtaisxplus.util;

import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;

/**
 * 代码生成工具类
 * 使用 IntelliJ VFS API 来创建和写入文件，确保IDE能立即感知到变化。
 */
public class CodeGenerator {

    /**
     * 将内容写入文件。
     *
     * @param project       当前项目
     * @param moduleSrcPath 模块的源码根路径 (例如: /path/to/your/project/src/main/java)
     * @param packageName   要生成的类的包名 (例如: com.example.entity)
     * @param fileName      文件名 (例如: User.java)
     * @param content       文件内容
     */
    public static void writeToFile(Project project, String moduleSrcPath, String packageName, String fileName, String content) {
        // 所有对文件的修改都应在 Write Command Action 中执行
        // 这使得操作是安全的、可撤销的，并且在正确的线程上运行
        WriteCommandAction.runWriteCommandAction(project, () -> {
            try {
                // 1. 将包名转换为相对路径 (com.example.entity -> com/example/entity)
                String packageAsPath = packageName.replace('.', '/');
                String fullDirectoryPath = Paths.get(moduleSrcPath, packageAsPath).toString();

                // 2. 使用 VFS API 创建目录结构。如果目录已存在，此方法不会做任何事。
                // 这是与IDE交互的正确方式，能保证IDE文件系统同步。
                VirtualFile directory = VfsUtil.createDirectories(fullDirectoryPath);

                // 3. 在目标目录中查找文件，如果不存在则创建
                VirtualFile file = directory.findChild(fileName);
                if (file == null) {
                    file = directory.createChildData(null, fileName);
                }

                // 4. 将内容以 UTF-8 编码写入文件
                file.setBinaryContent(content.getBytes(StandardCharsets.UTF_8));

                System.out.println("成功生成文件: " + file.getPath());

            } catch (IOException e) {
                // 在lambda表达式中，将受检异常包装成运行时异常抛出
                throw new RuntimeException("生成文件失败: " + fileName, e);
            }
        });
    }
    public static void writeToResourceFile(Project project, String resourceRootPath, String packageAsPath, String fileName, String content) {
        WriteCommandAction.runWriteCommandAction(project, () -> {
            try {
                String fullDirectoryPath = Paths.get(resourceRootPath, packageAsPath).toString();
                VirtualFile directory = VfsUtil.createDirectories(fullDirectoryPath);
                VirtualFile file = directory.findChild(fileName);
                if (file == null) {
                    file = directory.createChildData(null, fileName);
                }
                file.setBinaryContent(content.getBytes(StandardCharsets.UTF_8));
                System.out.println("成功生成资源文件: " + file.getPath());
            } catch (IOException e) {
                throw new RuntimeException("生成资源文件失败: " + fileName, e);
            }
        });
    }
}